#include <stdio.h>
#include <stdlib.h>

typedef struct Link
{
    // 数据域
    int ele;
    // 指针域
    struct Link * next; 
}link;

// 头结点、头指针、首元结点

link * initLink(){
    link *p=NULL; // 头指针
    link *temp = (link *)malloc(sizeof(link)); 
    // 头结点
    temp->ele = 1;
    temp->next = NULL;
    p=temp;
    for(int i=2;i<5;i++){
        link *a = (link *)malloc(sizeof(link));
        a->ele = i;
        a->next = NULL;
        temp->next = a;
        temp=temp->next;
    }
    return p;
}
// 展示
void showLink(link *p){
    link *temp=p; // 防止被改动
    while(temp){
        printf("%d ", temp->ele);
        temp = temp->next;
    }
    printf("\n");
}

// 插入
link * insert(link *p, int ele, int loc){
    // 先找到上一个节点
    link *temp=p;
    for(int i=1;i<loc;i++){
        temp = temp->next;
        if(temp==NULL){
            printf("插入位置无效\n");
            return p;
        }
    }
    // 创建新的节点
    link *c = (link *)malloc(sizeof(link));
    c->ele = ele;
    // 插入节点
    c->next = temp->next;
    temp->next = c;
    return p;
}

// 删除
link * delete(link *p, int loc){
    // 先找到上一个节点
    link *temp=p;
    temp = temp->next;
    for(int i=1;i<loc;i++){
        temp = temp->next;
        if(temp==NULL){
            printf("插入位置无效\n");
            return p;
        }
    }
    link *del = temp->next;
    temp->next = temp->next->next;
    free(del);
    return p;
}

// 查找
int find(link *p, int ele){
    link *temp=p;
    int i=1;
    while(temp){
        temp=temp->next;
        if(temp->ele==ele){
            return i;
        }
        i++;
    }
    return -1;
}

// 更新
link *update(link *p, int loc, int new){
    link *temp=p;
    temp = temp->next;
    for(int i=1;i<loc;i++){
        temp = temp->next;
    }
    temp->ele = new;
    return p;
}

// 线性表的链式存储结构：插入、删除

int main(){
    link * l = initLink();
    showLink(l);
    delete(l, 2);
    showLink(l);
    return 0;
}